package com.mbengue.corp.artisan.utils;

import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPTable;
import com.mbengue.corp.artisan.modele.Client;
import com.mbengue.corp.artisan.modele.Feuille;
import com.mbengue.corp.artisan.utils.abstrait.PdfExporteur;

public class FeuillePdfExporteur extends PdfExporteur {
  private static final long serialVersionUID = 5439625487894593087L;
  public static float[] LARGEUR_COLONNES = { 1.8f, 3f, 2.4f, 2.5f, 7f };
  public static String[] ENTETE_TABLEAU = { "Numéro", "Artisan", "Montant (€)", "Date", "Client" };
  private final Feuille feuille;
  private final boolean estVisualiseur;

  public FeuillePdfExporteur(Feuille feuille, String nomFichier, int nbLigne, boolean portraitOuPaysage,
      boolean estVisualiseur)
      throws DocumentException,
      IOException {
    super(nomFichier, nbLigne, portraitOuPaysage);
    this.feuille = feuille;
    this.estVisualiseur = estVisualiseur;
  }

  @Override
  protected float ajouterEnteteDocument(int page) throws DocumentException {
    PdfPTable header = new PdfPTable(2);
    header.setWidthPercentage(100f);
    header.getDefaultCell().setBackgroundColor(BaseColor.BLACK);
    header.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
    header.setSpacingBefore(25f);
    Font font = new Font(FontFamily.HELVETICA, 12f, Font.BOLD, BaseColor.WHITE);
    String texte;
    Phrase date;
    if (this.estVisualiseur) {
      texte = "Tou(te)s les factures (devis) de la base de données.";
      date = new Phrase(new SimpleDateFormat("dd MMMM yyyy", Locale.FRENCH).format(new Date()), font);
    } else {
      String type = this.feuille.getNumero().startsWith("F") ? "Facture" : "Devis";
      texte = type + " numéro: " + this.feuille.getNumero();
      date = new Phrase(new SimpleDateFormat("dd MMMMM yyyy", Locale.FRENCH).format(this.feuille.getDate()), font);
    }
    Phrase phrase = new Phrase(texte, font);
    header.addCell(phrase);
    header.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
    header.addCell(date);
    header.setSpacingAfter(10f);
    getDocument().add(header);
    float height = this.ajouterEnTeteFeuille();
    return header.getTotalHeight() + height;
  }

  private float ajouterEnTeteFeuille() throws DocumentException {
    if (this.estVisualiseur) {
      return 0f;
    }

    PdfPTable enTete = new PdfPTable(2);
    enTete.setWidthPercentage(100f);
    enTete.getDefaultCell().setUseAscender(true);
    enTete.getDefaultCell().setUseDescender(true);
    enTete.getDefaultCell().setFixedHeight(100f);
    enTete.addCell(this.feuille.getArtisan());
    Paragraph paragraphe = new Paragraph();
    Client client = this.feuille.getClient();
    paragraphe.add(client.getNom() + " " + client.getPrenom() + "\n\n");
    paragraphe.add(client.getAdresse() + "\n\n");
    paragraphe.add(client.getCodePostal() + " " + client.getVille() + "\n\n");
    paragraphe.add("Tel: " + client.getTelephone());
    enTete.addCell(paragraphe);
    enTete.setSpacingAfter(50f);
    getDocument().add(enTete);
    return enTete.getTotalHeight();
  }

  @Override
  protected void ajouterFooterDocument(int page) throws DocumentException {
    if (this.estVisualiseur) {
      return;
    }

    PdfPTable piedDePage = new PdfPTable(1);
    piedDePage.getDefaultCell().setUseAscender(true);
    piedDePage.getDefaultCell().setUseDescender(true);
    Font font = new Font(FontFamily.HELVETICA, 14f, Font.BOLD, BaseColor.BLACK);
    StringBuilder strBuilder = new StringBuilder("\nMontant TTC: ");
    strBuilder.append(new DecimalFormat("####.##").format(this.feuille.getMontant()));
    strBuilder.append(" €");
    strBuilder.append("\n\n");
    piedDePage.addCell(new Phrase(strBuilder.toString(), font));
    PdfContentByte canvas = getEcrivain().getDirectContent();
    piedDePage.setTotalWidth(200);
    piedDePage.writeSelectedRows(0, 2, 0, -1, 345, getEcrivain().getCurrentDocumentSize() + 100, canvas);
  }
}
